/***
 * 获取当前系统时间戳 并截取后8位
 *
 * @return
 */
export function getUnixTime() {
  return parseInt(Date.now().toString().substring(-8));
}

/**
 * 生成一个定长的随机纯数字符串
 *
 * @param length:number
 * @return 纯字符串
 */
export function generateNumString(length: number): string {
  let chars = '0123456789'.split('');
  let uuid = [];
  if (length) {
    for (let i = 0; i < length; i++) {
      uuid[i] = chars[0 | (Math.random() * chars.length)];
    }
  }
  return uuid.join('');
}

/**
 * 从不含校验位的卡号采用 Luhm 校验算法获得校验位
 * 1. 从右到左给卡号字符串编号，最右边第一位是1，最右边第二位是2，最右边第三位是3….
 * 2. 从右向左遍历，对每一位字符t执行第三个步骤，并将每一位的计算结果相加得到一个数s。
 * 3. 对每一位的计算规则：如果这一位是奇数位，则返回t本身，如果是偶数位，则先将t乘以2得到一个数n，如果n是一位数（小于10），直接返回n，否则将n的个位数和十位数相加返回。
 * 4. 如果s能够整除10，则此号码有效，否则号码无效。
 *
 * @param nonCheckCodeCardNo
 * @return
 */
export function getCardCheckCode(nonCheckCodeCardNo: String) {
  if (nonCheckCodeCardNo == null || nonCheckCodeCardNo.trim().length == 0) {
    return null;
  }
  let chs = nonCheckCodeCardNo.trim().split('');
  let luhmSum = 0;
  for (let i = chs.length - 1, j = 0; i >= 0; i--, j++) {
    let k = chs[i] == ' ' ? 9 : parseInt(chs[i]);
    if (j % 2 == 0) {
      k *= 2;
      k = k > 9 ? k - 9 : k;
    }
    luhmSum += k;
  }
  let k = luhmSum % 10 == 0 ? 10 : luhmSum % 10;
  return k == 10 ? 0 : k;
}

/**
 *
 * Description: 生成条码（卡号）
 *
 * @return
 */
export function getCodeNumber(prefix: String, length = 5): String {
  if (!prefix) {
    return 'prefix不能为空';
  }
  const st = prefix + generateNumString(length) + getUnixTime();
  return st + getCardCheckCode(st);
}

/**
 * 校验条码是否正确
 *
 * @param code
 * @return
 */
export function checkCode(code: String) {
  if (!code) {
    return 'code不能为空';
  }
  let bit = getCardCheckCode(code.substring(0, code.length - 1)) || 0;
  return code.charAt(code.length - 1) == bit.toString();
}
